EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみた
こんにちは、ゲームソリューショングループのsoraです。
今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことについて書いていきます。
構成
EC2にKinesis Agentをインストールして、Kinesis Data Firehoseを経由して、S3にログファイルを送信する構成です。
Kinesis Data FirehoseとS3の作成
Kinesis Data FirehoseとS3を作成します。(S3の作成は本記事では割愛します。)
Kinesis Data Firehoseについて、ソースはDirect PUT、送信先はS3として作成したS3を指定します。
EC2の準備
Webサーバの実装
EC2は以下ブログ記事内で作成したものに、アクセスログを出力するように修正したものを使用します。
GoでWebサーバを構築していますが、ApacheやNginxをインストールしたWebサーバでも問題ありません。
Kinesis Data Firehoseへログファイルを送信するため、EC2のIAMロールにはKinesis Data Firehoseへの権限を付与してください。
※間違えやすいポイントとして、IAMポリシーのActionについて、"kinesis"ではなく"firehose"が必要です。
本記事の主題とはずれますが、Goで構築したWebサーバではvar/log/golang-access.log
にアクセスログを出力するようなコードにしています。
package main import ( "html/template" "log" "net/http" "os" "time" ) func frontHandler(w http.ResponseWriter, r *http.Request) { // HTMLファイルのパース処理 resp, err := template.ParseFiles("front.html") if err != nil { log.Printf("template error: %v", err) } // 値の埋め込み+エラー処理 if err := resp.Execute(w, nil); err != nil { log.Printf("failed to execute template: %v", err) } } func accessLogHandler(next http.Handler, logger *log.Logger) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) logger.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start)) }) } func main() { // ログファイルのオープン logFile, err := os.OpenFile("../../var/log/golang-access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatalf("failed to open log file: %v", err) } defer logFile.Close() // ログ出力先をファイルに設定 logger := log.New(logFile, "", log.LstdFlags) http.HandleFunc("/front", frontHandler) // アクセスログを出力するようにミドルウェアを追加 http.ListenAndServe(":8080", accessLogHandler(http.DefaultServeMux, logger)) // リクエスト状態の開始 log.Fatal(http.ListenAndServe(":8080", nil)) }
Kinesis Agentのインストールと設定
EC2にSSHでアクセスして、以下コマンドを実行します。
# Kinesisエージェントのインストール $ sudo yum install –y aws-kinesis-agent # Kinesisエージェントの設定ファイルの修正 $ sudo vi /etc/aws-kinesis/agent.json
{ "cloudwatch.emitMetrics": false, "firehose.endpoint": "firehose.ap-northeast-1.amazonaws.com", "flows": [ { "filePattern": "<Kinesis Data Firehoseに送るログファイル(今回は/var/log/golang*.log)>", "deliveryStream": "<Kinesis Data Firehoseのストリーム名>" } ] }
設定ができたため、エージェントを起動します。
sudo service aws-kinesis-agent start
実行結果
EC2を起動してWebページにアクセスした後に、Kinesis Data Firehoseの配信ストリームのメトリクスを確認します。(何度か実行しているため、見づらくてすみません)
※もしKinesis Data Firehoseに正常にログを渡せていなければ、EC2にてvar/log/aws-kinesis-agent
にあるログを確認してみると良いです。
S3バケットも確認します。
配置されているオブジェクトをダウンロードして中身を確認してみます。(以下は一部抜粋したものです。)
2023/05/08 03:57:22 GET /front 686.065µs 2023/05/08 03:57:23 GET /favicon.ico 10.823µs 2023/05/08 03:57:24 GET /front 95.378µs 2023/05/08 03:57:25 GET /front 118.908µs 2023/05/08 03:57:25 GET /front 114.536µs 2023/05/08 03:57:25 GET /front 147.352µs 2023/05/08 03:57:26 GET /front 99.988µs 2023/05/08 03:57:26 GET /front 102.057µs 2023/05/08 04:06:30 GET /front 144.725µs
アクセスログがS3に配置できていることが確認できました。
参考ページ
Kinesis エージェントを使用した Kinesis Data Firehose への書き込み
最後に
今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことを記事にしました。
どなたかの参考になると幸いです。